﻿#include "Generation/Engine/Core/VecSet_Iterator.h"
#include "Generation/Engine/Core/VecSet.h"

FVecSet_Iterator::FVecSet_Iterator(FVecSet& vecset, int constructType)
{
	m_VecSet = &vecset;
	
	if (constructType == 0)
	{
		x = m_VecSet->XMin;
		y = m_VecSet->YMin;
	}
	else if (constructType == 1)
	{
		x = m_VecSet->XMin;	// 这个x不准确，不是正好的。todo：验证
		y = m_VecSet->YMax + 1;
	}
	
	m_Ptr = new FVec(x, y);
}

FVecSet_Iterator::reference FVecSet_Iterator::operator*()
{
	// UE_LOG(LogTD,Error,TEXT("Get %d %d"),(*m_Ptr).x,(*m_Ptr).y);
	return *m_Ptr;
}

FVecSet_Iterator& FVecSet_Iterator::operator++()
{

	// UE_LOG(LogTD, Error, TEXT("x++ %d %d"), x, y);

	MoveNext();
	
	m_Ptr->Set(x, y);
	return *this;
}

/// <summary>
/// 从xmin到xmax，从ymin到ymax，获得每一个；
/// 但是中途需要跳过一些没用的：
/// </summary>
bool FVecSet_Iterator::MoveNext()
{
	x++;
	if (x > m_VecSet->XMax)// 如果x已经超过x最大值，那么x回归最小值，y增加
		{
		x = m_VecSet->XMin;
		y++;
		}

	bool rtn = y <= m_VecSet->YMax;
	if(rtn)//没越界的情况
		{
		// 二次验证；如果验证失败尝试获取下一个
		if(m_VecSet->Values->Get(x, y) != m_VecSet->Sentinel) //标记不匹配，忽略
			{
			rtn = MoveNext();
			}
		}

	return rtn;
}